# HZip SCons构建脚本

import os
import sys
import subprocess

# 创建构建环境
env = Environment()

# 设置构建目录
build_dir = 'build'

# 设置编译器标志
env.Append(CPPFLAGS=['-Wall', '-Wno-multichar'])

# 添加包含路径
env.Append(CPPPATH=['#/src', '#/src/core', '#/src/formats', '#/src/ui', '#/src/utils'])

# 添加Haiku特定的包含路径
if sys.platform.startswith('haiku'):
    # 添加shared kit和interface kit的包含路径
    env.Append(CPPPATH=['/boot/system/develop/headers/shared', '/boot/system/develop/headers/interface'])

# 检测操作系统
is_haiku = False
if sys.platform.startswith('haiku'):
    is_haiku = True
    print('检测到Haiku OS环境')
    # Haiku特定的库
    env.Append(LIBS=['be', 'tracker'])
else:
    print('警告：在非Haiku环境下构建可能会导致问题')
    # 在非Haiku环境下，我们可能需要模拟某些库
    # 这里可以添加替代库或模拟库
    # 添加模拟Haiku的包含路径
    env.Append(CPPPATH=['/boot/system/develop/headers/shared', '/boot/system/develop/headers/interface'])
    # 创建私有头文件目录的包含路径
    env.Append(CPPPATH=['/boot/system/develop/headers/private/interface', '/boot/system/develop/headers/private/shared'])

# 检查必要的第三方库
conf = Configure(env)

# 检查zlib
if not conf.CheckLib('z'):
    print('警告：未找到zlib库，ZIP格式支持可能受限')
else:
    env.Append(CPPDEFINES=['HAVE_ZLIB'])

# 检查bzip2
if not conf.CheckLib('bzip2'):
    print('警告：未找到bzip2库，BZ2格式支持可能受限')
else:
    env.Append(CPPDEFINES=['HAVE_BZIP2'])

# 检查zstd
if not conf.CheckLib('zstd'):
    print('警告：未找到zstd库，zst格式支持可能受限')
else:
    env.Append(CPPDEFINES=['HAVE_ZSTD'])

env = conf.Finish()

# 导出环境给子目录使用
Export('env')

# 构建子目录
SConscript(['src/SConscript'])

# 构建hpkg软件包的函数
def BuildHpkg(env, target, source):
    # 检查是否在Haiku环境下
    if not is_haiku:
        print('错误：只能在Haiku环境下构建hpkg软件包')
        return
    
    # 创建构建目录
    package_dir = os.path.join(build_dir, 'package')
    if not os.path.exists(package_dir):
        os.makedirs(package_dir)
    
    # 创建符合HaikuOS规范的目录结构
    # 应用程序目录
    app_dir = os.path.join(package_dir, 'apps/HZip')
    if not os.path.exists(app_dir):
        os.makedirs(app_dir)
    
    # 应用程序数据目录
    app_data_dir = os.path.join(app_dir, 'data')
    if not os.path.exists(app_data_dir):
        os.makedirs(app_data_dir)
    
    # 应用程序字体目录
    app_fonts_dir = os.path.join(app_data_dir, 'fonts')
    if not os.path.exists(app_fonts_dir):
        os.makedirs(app_fonts_dir)
    
    # 命令行工具目录
    bin_dir = os.path.join(package_dir, 'bin')
    if not os.path.exists(bin_dir):
        os.makedirs(bin_dir)
    
    # Tracker插件目录
    addon_dir = os.path.join(package_dir, 'add-ons/Tracker')
    if not os.path.exists(addon_dir):
        os.makedirs(addon_dir)
    
    # MIME类型目录
    mime_dir = os.path.join(package_dir, 'data/mime_db')
    if not os.path.exists(mime_dir):
        os.makedirs(mime_dir)
    
    # 复制package-info到构建目录
    subprocess.call(['cp', 'package-info', package_dir])
    
    # 复制主程序到应用程序目录
    subprocess.call(['cp', os.path.join(build_dir, 'hzip'), os.path.join(app_dir, 'HZip')])
    
    # 创建命令行工具的符号链接
    subprocess.call(['ln', '-sf', '/apps/HZip/HZip', os.path.join(bin_dir, 'hzip')])
    
    # 复制Tracker插件到插件目录
    # 在SCons中，SharedLibrary会自动添加lib前缀，所以实际文件名是libHZip.so
    subprocess.call(['cp', os.path.join(build_dir, 'libHZip.so'), os.path.join(addon_dir, 'HZip')])
    
    # 复制字体资源文件
    fonts_src_dir = os.path.join('src', 'assets', 'fonts')
    for font_file in os.listdir(fonts_src_dir):
        font_path = os.path.join(fonts_src_dir, font_file)
        if os.path.isfile(font_path):
            subprocess.call(['cp', font_path, app_fonts_dir])
    
    # 复制MIME类型定义文件
    mime_types_file = os.path.join('src', 'assets', 'mime', 'HZip.types')
    if os.path.exists(mime_types_file):
        subprocess.call(['cp', mime_types_file, mime_dir])
    
    # 复制卸载脚本到bin目录
    uninstall_script = os.path.join('src', 'assets', 'scripts', 'uninstall_mime.sh')
    if os.path.exists(uninstall_script):
        subprocess.call(['cp', uninstall_script, bin_dir])
        subprocess.call(['chmod', '+x', os.path.join(bin_dir, 'uninstall_mime.sh')])
    
    # 调用package命令创建hpkg包
    package_cmd = ['package', 'create', '-C', package_dir, os.path.join(build_dir, 'hzip-1.0.0.hpkg')]
    subprocess.call(package_cmd)
    
    return None

# 添加hpkg构建目标
hpkg_builder = Builder(action=BuildHpkg)
env.Append(BUILDERS={'Hpkg': hpkg_builder})

# 创建hpkg目标
# 使用正确的库文件名称，与SharedLibrary生成的文件名一致
hpkg = env.Hpkg('hzip-1.0.0.hpkg', ['hzip', os.path.join(build_dir, 'libHZip.so'), 'package-info'])
env.Alias('hpkg', hpkg)